<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of ProdutoMapper
 *
 * @author felipe
 */
class App_Model_ProdutoMapper extends Voitech_Mapper{
    
    public function __construct(App_Model_Produto $obModel) {
        $this->obModel = $obModel;        
    }
    
    public function buscarPorId() {
        $obRow = App_Model_Db_Produto::build()->buscarPorId($this->obModel->getCoProduto());
        if(empty($obRow))
        {
            return;
        }
        return $this->carregar($obRow)->getObModel();               
    }
    
    public function carregar(stdClass $obRow) {
        $obTipoProdutoMapper = new App_Model_TipoProdutoMapper(new App_Model_TipoProduto());               
        $obCategoriaMapper = new App_Model_CategoriaMapper(new App_Model_Categoria());
        $this->obModel->setCoProduto($obRow->co_produto)
                      ->setNoProduto($obRow->no_produto)
                      ->setNuTotalProduto($obRow->nu_total_produto)
                      ->setStAtivo($obRow->st_ativo_produto)     
                      ->setExcluir($obRow->excluir)   
                      ->setDtCadastro($obRow->dt_cadastro_produto)        
                      ->setObTipoProduto($obTipoProdutoMapper->carregar($obRow)->getObModel())
                      ->setObCategoria($obCategoriaMapper->carregar($obRow)->getObModel());
        return $this;
    }
    
    public function cadastrar() {
        $arrProduto = $this->retornarArrayPopulado();  
        $arrProduto['co_pessoa_cadastro'] = $this->obModel->getObUsuarioCadastro()->getCoPessoa();
        return App_Model_Db_Produto::build()->insert($arrProduto);                                         
    }
    
    public function alterar(){
        if($this->obModel->getCoProduto() == ''){
            throw new Voitech_Exception('Falta cod. produto');
        }
        $arrProduto = $this->retornarArrayPopulado();
        unset($arrProduto['nu_total_produto']);        
        return App_Model_Db_Produto::build()->update($arrProduto,App_Model_Db_Produto::build()->getAdapter()->quoteInto('co_produto = ?',$this->obModel->getCoProduto()));                
    }
    
    public function ativar() {
        if($this->obModel->getCoProduto() == ''){
            throw new Voitech_Exception('Falta cod. produto');
        }
        $arrProduto = array('st_ativo'=>'S');       
        return App_Model_Db_Produto::build()->update($arrProduto,App_Model_Db_Produto::build()->getAdapter()->quoteInto('co_produto = ?',$this->obModel->getCoProduto()));                
    }
    
    public function desativar() {
        if($this->obModel->getCoProduto() == ''){
            throw new Voitech_Exception('Falta cod. produto');
        }
        $arrProduto = array('st_ativo'=>'N');
        return App_Model_Db_Produto::build()->update($arrProduto
                                                   ,App_Model_Db_Produto::build()->getAdapter()->quoteInto('co_produto = ?',$this->obModel->getCoProduto()));                
    }
    
    public function retornarArrayPopulado() {
        $arrProduto = array('no_produto'=>$this->obModel->getNoProduto()
                           ,'co_tipo_produto'=>$this->obModel->getObTipoProduto()->getCoTipoProduto()
                           ,'nu_total_produto'=>$this->obModel->getNuTotalProduto()
                           ,'co_categoria'=>$this->obModel->getObCategoria()->getCoCategoria());
        return $arrProduto;
    }
    
    public function excluir() {
        if($this->obModel->getCoProduto() == ''){
            throw new Voitech_Exception('Falta cod. produto');
        }
        return App_Model_Db_Produto::build()->delete(App_Model_Db_Produto::build()->getAdapter()->quoteInto('co_produto = ?',$this->obModel->getCoProduto()));                
    }  

    public function atualizarEstoque() {
        if($this->obModel->getCoProduto() == ''){
            throw new Voitech_Exception('Falta cod. produto');
        }
        
        if($this->obModel->getNuTotalProduto() < 0){
        	
        	$nuTotalProduto = $this->obModel->getNuTotalProduto();
        	$obRow = App_Model_Db_Produto::build()->buscarPorId($this->obModel->getCoProduto());
        	if( $obRow->nu_total_produto < ($this->obModel->getNuTotalProduto() * (-1))){
        		throw new Voitech_Exception('Quantidade maior que a quantidade em estoque do produto.<br><br>' . ' <strong>Produto:</strong> '.$obRow->no_produto 
        										. '<br> <strong>Quant. Solicitada:</strong> ' .  ($this->obModel->getNuTotalProduto() * (-1)) . ' ' . $obRow->no_tipo_produto
        										. '<br> <strong>Total  em Estoque:</strong> ' .  $obRow->nu_total_produto . ' ' . $obRow->no_tipo_produto);
        	} 
        }
        
        
        $arrProduto = array('nu_total_produto'=>new Zend_DB_Expr('nu_total_produto+'.$this->obModel->getNuTotalProduto() ) );
        return App_Model_Db_Produto::build()->update($arrProduto
                                                   ,App_Model_Db_Produto::build()->getAdapter()->quoteInto('co_produto = ?',$this->obModel->getCoProduto()));                
    }   
    
}
